package com.multi.source.service.impl;

import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.multi.common.utils.DateUtils;
import com.multi.common.utils.SecurityUtils;
import com.multi.common.utils.sign.Base64;
import com.multi.source.domain.BkDataSourceInfo;
import com.multi.source.mapper.BkDataSourceInfoMapper;
import com.multi.source.resp.BkDataSourceInfoResp;
import com.multi.source.service.DataSourceInfoService;
import com.multi.source.service.IBkDataBaseInfoService;
import com.multi.source.service.SystemDbService;
import com.multi.source.vo.DataSourceInfoVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description 数据库业务类接口实现
 * @ClassName DataSourceInfoServiceImpl
 * @Author pzj
 * @Data 2024/11/19 10:19
 */
@Service
public class DataSourceInfoServiceImpl implements DataSourceInfoService {

    @Autowired
    private BkDataSourceInfoMapper bkDataSourceInfoMapper;

    @Autowired
    private IBkDataBaseInfoService bkDataBaseInfoService;

    @Autowired
    private SystemDbService systemDbService;


    /**
     * 查询数据库资源配置信息
     *
     * @param id 数据库资源配置信息主键
     * @return 数据库资源配置信息
     */
    @Override
    public BkDataSourceInfo selectBkDataSourceInfoById(Long id)
    {
        return bkDataSourceInfoMapper.selectBkDataSourceInfoById(id);
    }

    /**
     * 查询数据库资源配置信息列表
     *
     * @param dataSourceInfoVo 数据库资源配置信息
     * @return 数据库资源配置信息
     */
    @Override
    public List<BkDataSourceInfoResp> selectBkDataSourceInfoList(DataSourceInfoVo dataSourceInfoVo)
    {
        List<BkDataSourceInfoResp> bkDataSourceInfos = bkDataSourceInfoMapper.selectBkDataSourceInfoList(dataSourceInfoVo);
        //这里对密码进行加密操作
        for (BkDataSourceInfoResp bkDataSourceInfo : bkDataSourceInfos) {
            String password = bkDataSourceInfo.getPassword();
            String encode = Base64.encode(password.getBytes());
            bkDataSourceInfo.setPassword(encode);
        }
        return bkDataSourceInfos;
    }

    /**
     * 新增数据库资源配置信息
     *
     * @param bkDataSourceInfo 数据库资源配置信息
     * @return 结果
     */
    @Override
    public int insertBkDataSourceInfo(BkDataSourceInfo bkDataSourceInfo)
    {
        bkDataSourceInfo.setCreateTime(DateUtils.getNowDate());
        return bkDataSourceInfoMapper.insertBkDataSourceInfo(bkDataSourceInfo);
    }

    /**
     * 修改数据库资源配置信息
     *
     * @param bkDataSourceInfo 数据库资源配置信息
     * @return 结果
     */
    @Override
    public int updateBkDataSourceInfo(BkDataSourceInfo bkDataSourceInfo)
    {
        bkDataSourceInfo.setUpdateTime(DateUtils.getNowDate());
        return bkDataSourceInfoMapper.updateBkDataSourceInfo(bkDataSourceInfo);
    }

    /**
     * 批量删除数据库资源配置信息
     *
     * @param ids 需要删除的数据库资源配置信息主键
     * @return 结果
     */
    @Override
    public int deleteBkDataSourceInfoByIds(Long[] ids)
    {
        return bkDataSourceInfoMapper.deleteBkDataSourceInfoByIds(ids);
    }

    /**
     * 删除数据库资源配置信息信息
     *
     * @param id 数据库资源配置信息主键
     * @return 结果
     */
    @Override
    public int deleteBkDataSourceInfoById(Long id)
    {
        return bkDataSourceInfoMapper.deleteBkDataSourceInfoById(id);
    }

    /**
     * 创建配置数据库信息
     *
     * 这里需要提前创建数据连接，要不然DS事务无法控制
     * @param dataSourceInfoVo
     * @return
     */
    @Override
    @DSTransactional
    public Boolean createDataSource(DataSourceInfoVo dataSourceInfoVo) {
        BkDataSourceInfo bkDataSourceInfo = new BkDataSourceInfo();
        BeanUtils.copyProperties(dataSourceInfoVo,bkDataSourceInfo);
        bkDataSourceInfo.setCreateBy(SecurityUtils.getUsername());
        //存储相关数据库连接配置
        bkDataSourceInfoMapper.insertBkDataSourceInfo(bkDataSourceInfo);
        //根据这配置生产新的数据库
        systemDbService.createDataSource(bkDataSourceInfo);
        //新增对应的业务数据库数量
        bkDataBaseInfoService.addServiceDbNums(dataSourceInfoVo.getDbIp(), dataSourceInfoVo.getDbPort());
        return Boolean.TRUE;
    }

    /**
     * 查询全部有用配置
     * @return
     */
    @Override
    public List<BkDataSourceInfo> selectUsefulDataConfig() {
        //查询租户数据库配置信息
        List<BkDataSourceInfo> list = bkDataSourceInfoMapper.selectList();
        return list;
    }

    /**
     * 查询数据库关联配置
     * @param tenantId
     * @return
     */
    @Override
    public BkDataSourceInfo selectDataSource(Long tenantId) {
        return bkDataSourceInfoMapper.selectDataSourceByTenantId(tenantId);
    }
}
